package com.gxzy.util;

import org.apache.commons.lang.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 时间工具
 */

public class DateUtil {

    public static String getNow() {

        Date date = new Date();
        String str = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(str);
        return sdf.format(date);
    }


    public static String getNow(Date date) {
        String str = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(str);
        return sdf.format(date);
    }

    /**
     * 将指定的时间按照特定的格式转化
     *
     * @param date
     * @param fat
     * @return
     */
    public static String getDate(Date date, String fat) {
        SimpleDateFormat sdf = new SimpleDateFormat(fat);
        return sdf.format(date);
    }


    /**
     * 字符串时间转Date
     *
     * @param date0
     * @return
     */
    public static Date str2Date(String date0, String fat) {
        //注意：SimpleDateFormat构造函数的样式与strDate的样式必须相符
        SimpleDateFormat sDateFormat = new SimpleDateFormat(fat); //加上时间
        //必须捕获异常
        try {
            Date date = sDateFormat.parse(date0);
            return date;
        } catch (ParseException px) {
//            px.printStackTrace();
            return null;
        }
    }

    /**
     * 获取今天
     *
     * @return
     */
    public static String getToday() {
        Date date = new Date();
        String str = "yyyy-MM-dd";
        SimpleDateFormat sdf = new SimpleDateFormat(str);
        return sdf.format(date);
    }

    /**
     * 根据指定的时间戳获取当前凌晨的时间戳
     *
     * @param second
     * @return
     */
    public static long getITSH(long second) {
        long now = second / 1000l;
        long daySecond = 60 * 60 * 24;
        long dayTime = now - (now + 8 * 3600) % daySecond;
        return dayTime;
    }

    /**
     * 计算年龄
     *
     * @param birth 出生日志
     * @return
     */
    public static int calcAge(Date birth) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        int nowYear = calendar.get(Calendar.YEAR);
        calendar.setTime(birth);
        return nowYear - calendar.get(Calendar.YEAR);
    }

    /**
     * 获取指定类型的转换数据集-键值对（周、月）
     *
     * @param type 类型
     * @return
     */
    public static Map<String, String> getDWMNameForMySQL(String type) {
        Map<String, String> res = new HashMap<>();

        switch (type) {
            case "w":
            case "week":
                res.put("0", "周日");
                res.put("1", "周一");
                res.put("2", "周二");
                res.put("3", "周三");
                res.put("4", "周四");
                res.put("5", "周五");
                res.put("6", "周六");
                break;
            case "mohth":
            case "m":
                res.put("01", "一月");
                res.put("02", "二月");
                res.put("03", "三月");
                res.put("04", "四月");
                res.put("05", "五月");
                res.put("06", "六月");
                res.put("07", "七月");
                res.put("08", "八月");
                res.put("09", "九月");
                res.put("10", "十月");
                res.put("11", "十一月");
                res.put("12", "十二月");
                break;
            case "hour":
            case "h":
                res.put("00", "00:00");
                res.put("01", "01:00");
                res.put("02", "02:00");
                res.put("03", "03:00");
                res.put("04", "04:00");
                res.put("05", "05:00");
                res.put("06", "06:00");
                res.put("07", "07:00");
                res.put("08", "08:00");
                res.put("09", "09:00");
                res.put("10", "10:00");
                res.put("11", "11:00");
                res.put("12", "12:00");
                res.put("13", "13:00");
                res.put("14", "14:00");
                res.put("15", "15:00");
                res.put("16", "16:00");
                res.put("17", "17:00");
                res.put("18", "18:00");
                res.put("19", "19:00");
                res.put("20", "20:00");
                res.put("21", "21:00");
                res.put("22", "22:00");
                res.put("23", "23:00");
                break;
        }
        return res;
    }

    /**
     * 获取指定类型的转换数据集-集合（周、月）
     *
     * @param type
     * @return
     */
    public static List<String> getWMNamesForMySQL(String type) {
        List<String> res = new LinkedList<>();

        switch (type) {
            case "w":
            case "week":
                res.add("周一");
                res.add("周二");
                res.add("周三");
                res.add("周四");
                res.add("周五");
                res.add("周六");
                res.add("周日");
                break;
            case "mohth":
            case "m":
                res.add("一月");
                res.add("二月");
                res.add("三月");
                res.add("四月");
                res.add("五月");
                res.add("六月");
                res.add("七月");
                res.add("八月");
                res.add("九月");
                res.add("十月");
                res.add("十一月");
                res.add("十二月");
                break;
            case "hour":
            case "h":
                res.add("00:00");
                res.add("01:00");
                res.add("02:00");
                res.add("03:00");
                res.add("04:00");
                res.add("05:00");
                res.add("06:00");
                res.add("07:00");
                res.add("08:00");
                res.add("09:00");
                res.add("10:00");
                res.add("11:00");
                res.add("12:00");
                res.add("13:00");
                res.add("14:00");
                res.add("15:00");
                res.add("16:00");
                res.add("17:00");
                res.add("18:00");
                res.add("19:00");
                res.add("20:00");
                res.add("21:00");
                res.add("22:00");
                res.add("23:00");
                break;
        }
        return res;
    }

    /**
     * 将日期的中文名转换成对应的数值
     *
     * @param name 名称
     * @return
     */
    public static int getHWMNumByName(String name) {
        switch (name) {
            case "周一":
                return 1;
            case "周二":
                return 2;
            case "周三":
                return 3;
            case "周四":
                return 4;
            case "周五":
                return 5;
            case "周六":
                return 6;
            case "周日":
                return 7;
            case "一月":
                return 1;
            case "二月":
                return 2;
            case "三月":
                return 3;
            case "四月":
                return 4;
            case "五月":
                return 5;
            case "六月":
                return 6;
            case "七月":
                return 7;
            case "八月":
                return 8;
            case "九月":
                return 9;
            case "十月":
                return 10;
            case "十一月":
                return 11;
            case "十二月":
                return 12;
            default:
                if (name.contains(":00")) {
                    return Integer.parseInt(name.substring(0, 2));
                }

                return StringUtils.isNotBlank(name) && StringUtils.isNumeric(name)
                        ? Integer.parseInt(name) : 0;
        }
    }
}
